﻿#include<iostream>
using namespace std;
class A
{
public:
	A(int a = 0)
		: _a(a)
	{
		cout << "A():" << this << endl;
	}
	~A()
	{
		cout << "~A():" << this << endl;
	}
private:
	int _a;
};
// 定位new/replacement new
int main()
{
	// p1现在指向的只不过是与A对象相同大小的一段空间，还不能算是一个对象，因为构造函数没有执行
	A* p1 = (A*)malloc(sizeof(A));
	new(p1)A;  // 注意：如果A类的构造函数有参数时，此处需要传参
	p1->~A();
	free(p1);
	A* p2 = (A*)operator new(sizeof(A));
	new(p2)A(10);
	p2->~A();
	operator delete(p2);
	return 0;
}
//class A
//{
//public:
//	A(int a = 0)
//		:_a(a)
//	{
//		cout << "A():" << this << endl;
//	}
//	//~A()
//	//{
//	//	cout << "~A():" << this << endl;
//	//}
//private:
//	int _a;
//};
//int main()
//{
//	//不会报错
//	int* p6 = new int[10];
//	delete p6;
//	//会报错
//	A* p = new A[10];
//	delete p;
//	return 0;
//}
///*
//operator new：该函数实际通过malloc来申请空间，当malloc申请空间成功时直接返回；申请空间
//失败，尝试执行空               间不足应对措施，如果改应对措施用户设置了，则继续申请，否
//则抛异常。
//*/
//void* __CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
//{
//	// try to allocate size bytes
//	void* p;
//	while ((p = malloc(size)) == 0)
//		if (_callnewh(size) == 0)
//		{
//			// report no memory
//			// 如果申请内存失败了，这里会抛出bad_alloc 类型异常
//			static const std::bad_alloc nomem;
//			_RAISE(nomem);
//		}
//		return (p);
//}
///*
//operator delete: 该函数最终是通过free来释放空间的
//*/
//void operator delete(void* pUserData)
//{
//	_CrtMemBlockHeader* pHead;
//	RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
//	if (pUserData == NULL)
//		return;
//	_mlock(_HEAP_LOCK);  /* block other threads */
//	__TRY
//		        /* get a pointer to memory block header */
//		pHead = pHdr(pUserData);
//	         /* verify block type */
//	_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
//	_free_dbg(pUserData, pHead->nBlockUse);
//	__FINALLY
//		_munlock(_HEAP_LOCK);  /* release other threads */
//	__END_TRY_FINALLY
//		return;
//}
///*
//free的实现
//*/
//#define   free(p)               _free_dbg(p, _NORMAL_BLOCK)
//class A
//{
//public:
//	A(int a = 0)
//		:_a(a)
//	{
//		cout << "A():" << this << endl;
//	}
//	~A()
//	{
//		cout << "~A():" << this << endl;
//	}
//private:
//	int _a;
//};
//int main()
//{
//	A* p1 = (A*)malloc(sizeof(A));
//	A* p2 = new A;
//	free(p1);
//	delete p2;
//	return 0;
//}
////抛异常
//double Divide(int a, int b)
//{
//	try 
//	{
//		if (b == 0)
//		{
//			string s("Divide by zero condition!");
//			throw s;
//		}
//		else
//		{
//			return ((double)a / (double)b);
//		}
//	}
//	catch (int errid)
//	{
//		cout << errid << endl;
//	}
//	return 0;
//}
//int main()
//{
//	//捕获异常
//	try 
//	{
//		int len, t;
//		cin >> len >> t;
//		cout << Divide(len, t) << endl;
//	}
//	catch (const string& s)
//	{
//		cout << s << endl;
//	}
//	return 0;
//}
////new/delete的使用
//int main()
//{
//	//动态申请一个int类型的空间
//	//但是不会初始化
//	int* ptr1 = new int;
//	//将*ptr2初始化为1
//	int* ptr2 = new int(1);
//	//动态申请10个int类型的空间
//	//这样也不会初始化
//	int* ptr3 = new int[10];
//	//[]里面的是对象的个数，和我们定义数组一样
//	//初始化
//	int* ptr4 = new int[10] {1, 2, 3};
//	//这样将数组前三个元素置为1 2 3，其他元素默认置为0
//	cout << *ptr1 << " " << *ptr2 << " " << ptr3[0] << " " << ptr4[0] << endl;
//	delete ptr1;
//	delete ptr2;
//	//会报错（运行时）
//	//delete ptr3;
//	//delete ptr4;
//	//正确释放多个对象的空间的写法
//	delete[] ptr3;
//	delete[] ptr4;
//	return 0;
//}
//int glb = 1;
//static int sglb = 1;
//void Test()
//{
//	static int sc = 1;
//	int lv = 1;
//	int num1[10] = { 1,2,3,4 };
//	const char* pchar3 = "abcd";
//	char char2[] = "abcd";
//	int* ptr1 = (int*)malloc(sizeof(int) * 4);
//	int* ptr2 = (int*)calloc(4, sizeof(int) * 4);
//	int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
//	free(ptr1);
//	free(ptr3);
//}